11.6 組込み手続きとモジュール
-
[6.2]
組み込みサブルーチン
MOVE_ALLOC
に、省略可能なSTAT
およびERRMSG
引数が追加されました。STAT
引数は、整数型で、小数点以下の範囲が4以上である必要があります(つまり、8ビット整数ではありません)。 サブルーチンが正常に実行された場合は値ゼロが割り当てられ、それ以外の場合はゼロ以外の値が割り当てられます。ERRMSG
引数は、基本種別の文字型である必要があります。STAT
が存在し、ゼロ以外の値が割り当てられている場合、ERRMSG
には説明メッセージが割り当てられます(存在する場合)。 それ以外の場合、ERRMSG
は以前の値(存在する場合)を保持します。例)
INTEGER,ALLOCATABLE :: x(:),y(:) INTEGER istat CHARACTER(80) emsg ... CALL MOVE_ALLOC(x,y,istat,emsg) IF (istat/=0) THEN PRINT *,'Unexpected error in MOVE_ALLOC: ',TRIM(emsg)
これらの引数の目的は、
STAT_STOPPED_IMAGE
やSTAT_FAILED_IMAGE
などの複数の像の共配列の割付け/割付け解除のエラーをキャッチすることです。 -
[7.1]
組込み関数
ALL
、ANY
、FINDLOC
、IALL
、IANY
、IPARITY
、MAXLOC
、MAXVAL
、MINLOC
、MINVAL
、NORM2
、PARITY
、PRODUCT
、及びSUM
のDIM
引数は実行時に存在する限り、省略可能な仮引数にすることができます。
例)Subroutine sub(x,n) Real,Intent(In) :: x(:,:,:) Integer,Intent(In),Optional :: n If (Present(n)) Then Print *,Norm2(x,n) ! Rank two array result. Else Print *,Norm2(x) ! Scalar result. End If End Subroutine
-
[7.1]
個別組込み関数は廃止されたと見なされます(-f2018オプションでそのように報告されます)。
個別でも総称でもある関数(例えば
SQRT
)の廃止された使用法は、 実引数として渡すか、手続引用仕様として使用するか、手続きポインタ割付け指示先となるかです。 -
[7.1]
組込照会関数
RANK
は、引数の次元を返します。 書式は次のとおりです。RANK ( A )
A
: 任意の型のデータ実体結果 : 基本種別のスカラ整数
結果は
A
の次元数です。つまりA
がスカラの場合はゼロ、A
が1次元配列の場合は1、等々。この関数は、
A
が次元数引継ぎ変数である場合を除いて、定数式で使用できます。 -
[7.1]
組込み関数
REDUCE
は、ユーザー定義の配列集約を実行します。 書式は次のとおりです。REDUCE ( ARRAY, OPERATION [, MASK, IDENTITY, ORDERED ] ) or REDUCE ( ARRAY, OPERATION DIM [, MASK, IDENTITY, ORDERED ] )
ARRAY
:任意の型の配列OPERATION
:2つの引数を持つ純粋関数。各引数は、ARRAY
と同じ宣言型および型パラメータを持つ、スカラ、非割り付け可能、非ポインター、非多態性の非省略可能変数です。 一方の引数にASYNCHRONOUS
、TARGET
、またはVALUE
属性がある場合、もう一方にもその属性が必要です。 結果は、ARRAY
と同じ型および型パラメーターを持つ非多相スカラ変数である必要があります。DIM
:1からNの範囲のスカラ整数。ここでNはARRAY
の次元数です。MASK
:論理型でARRAY
と同じ形状のスカラまたは配列IDENTITY
:ARRAY
と同じ宣言された型と型パラメタを持つスカラORDERED
:論理型のスカラ結果:
ARRAY
と同じ型および型パラメタ。結果は、ユーザー指定の
OPERATION
によってARRAY
が集約されます。DIM
が存在しない場合、(マスクされた)ARRAY
全体がスカラ結果に集約されます。DIM
が存在する場合、結果の次元数はN-1になり、ARRAY
の形状は次元DIM
が集約されます。 結果の各要素は、その次元のマスクされた要素の集約です。正確に1つの要素が結果値に寄与する場合、その値は要素と等しくなります。つまり、
OPERATION
は、複数の要素が表示された場合にのみ呼び出されます。結果値に寄与する要素がない場合は、
IDENTITY
引数が存在する必要があり、その値はIDENTITY
と同じです。例)
Module triplet_m Type triplet Integer i,j,k End Type Contains Pure Type(triplet) Function tadd(a,b) Type(triplet),Intent(In) :: a,b tadd%i = a%i + b%i tadd%j = a%j + b%j tadd%k = a%k + b%k End Function End Module Program reduce_example Use triplet_m Type(triplet) a(2,3) a = Reshape( [ triplet(1,2,3),triplet(1,2,4), & triplet(2,2,5),triplet(2,2,6), & triplet(3,2,7),triplet(3,2,8) ], [ 2,3 ] ) Print 1, Reduce(a,tadd) Print 1, Reduce(a,tadd,1) Print 1, Reduce(a,tadd,a%i/=2) Print 1, Reduce(Array=a,Dim=2,Operation=tadd) Print 1, Reduce(a, Mask=a%i/=2, Dim=1, Operation=tadd, Identity=triplet(0,0,0)) 1 Format(1x,6('triplet(',I0,',',I0,',',I0,')',:,'; ')) End Program
上記コードは以下を出力しますtriplet(12,12,33) triplet(2,4,7); triplet(4,4,11); triplet(6,4,15) triplet(8,8,22) triplet(6,6,15); triplet(6,6,18) triplet(2,4,7); triplet(0,0,0); triplet(6,4,15)
-
[7.0]
組込みのATOMICサブルーチン
ATOMIC_ADD
、ATOMIC_AND
、ATOMIC_CAS
、ATOMIC_FETCH_ADD
、ATOMIC_FETCH_AND
、ATOMIC_FETCH_OR
、ATOMIC_FETCH_XOR
、ATOMIC_OR
、及びATOMIC_XOR
は、高度な共配列プログラミングで説明されています。 -
[7.1]
個別集約サブルーチン
CO_BROADCAST
、CO_MAX
、CO_MIN
、CO_REDUCE
、およびCO_SUM
は、高度な共配列プログラミングで説明されています。 -
[7.0]
組込み関数
COSHAPE
、EVENT_QUERY
、FAILED_IMAGES
、GET_TEAM
、IMAGE_STATUS
、STOPPED_IMAGES
、およびTEAM_NUMBER
、および組み込み関数NUM_IMAGES
、及びTHIS_IMAGE
は、高度な共配列プログラミングで説明されています。